工具动力学/重力参数在线辨识接口说明

修订日期 修订版本 修订内容 修订人
2025.6.30 V0.1 初始化文档,工具动力学参数在线辨识接口 刘赛男

目前基于电流的负载参数在线辨识只有一种类型:type = TOOL_GRAVITY_JNT_CURRENT_ONLINE(基于关节电流的工具重力参数在线辨识),其基本流程和接口如下:

1.设置相关参数

1.1 建立机器人算法接口实例

/**
* @brief 初始化算法库, 生成机器人模型
* @param urdfModel: urdf模型, 以字符串形式描述
* @param srdfModel: srdf模型, 以字符串形式描述
* @return < 0, 表示初始化失败
*/
ARAL_API_BASIC(1.0) int rlInitiateRobotModel(const std::string& urdfModel, const std::string& srdfModel) = 0;

/**
* @brief 初始化算法库, 设置机械臂模型及配置参数信息(算法会自动加载对应的文件)
* @param robot_name: 机械臂名称
* @param path: urdf, meshes等资源文件夹所在的路径(如./aral_export/aubo_description/)
*/
ARAL_API_BASIC(1.0) int rlInitiateRobotModelFromFiles(const std::string& robot_name, const std::string& path) = 0;

1.2 设置力矩常数

/**
* @brief 设置机械臂各关节的力矩常数, 单位: (Nm/A)
* @param moduleConstants: 力矩常数, 向量的维度应该和关节个数一致
*/
ARAL_API_COMMON(1.0) void mdlSetJointTorqueConstant(const RLJntArray& moduleConstants) = 0;

1.3设置摩擦力参数

 /**
 * @brief 设置关节摩擦参数, 该参数一般通过读取关节驱动中的参数而获得
 * @param friPara: 摩擦模型参数结构体, 长度为机器人自由度(一般是6), 顺序为[J1,J2,J3,J4,J5,J6]
 *                 类型为 VTL_Model 速度-温度-载荷模型
 *                 具体参数及顺序为[Fs, Fc, Vs, Miu, Fv0, Fv1, Fv2, Fv3, Ft1, Ft2, Ft3, c1, c2]
 * @return < 0, 表示设置失败
 */
ARAL_API_COMMON(1.0) int mdlSetJointFrictionParameter(const std::vector<FrictionParam>& friPara) = 0;

1.4 设置重力加速度

/**
 * @brief 设置重力加速度向量在机械臂基坐标系下的描述
 * @param vec[0]: 重力加速度在机械臂基坐标系X轴上的分量
 *        vec[1]: 重力加速度在机械臂基坐标系Y轴上的分量
 *        vec[2]: 重力加速度在机械臂基坐标系Z轴上的分量
 * @return if < 0, 表示设置失败
 */
ARAL_API_COMMON(1.0) int mdlSetGravityVectorInBase(const Array3d& vec) = 0;

1.5设置动力学参数

/**
  * @brief 设置机械臂的连杆动力学参数
  * @param real_para: 实际辨识出来的参数,参数格式为: real_para = [参数类型, 辨识的参数]
  *                   1. real_para[0] = 0; size(real_para) = 60 + 1, 输入参数含义为 m, mx, my, mz, ixx, ixy, ixz, iyy, iyz, izz ..., 需要另外设置转子惯量.否则为urdf里面的值.
  *                   2. real_para[0] = 1; size(real_para) = 58 + 1, 对应 aral 动力学标定接口的数据输出格式.
  *                   3. real_para[0] = 2; size(real_para) = 42 + 1, 对应第一版拖动示教导入生产写在底座的数据格式.
  * @return: if < 0, 则设置的参数类型或大小不正确
  */
ARAL_API_COMMON(1.0) int mdlSetRobotLinkDynamicParameter(const std::vector<double>& real_para) = 0;

1.6 设置激励轨迹和辨识配置信息

struct CalibConfig
{
    DynCalibType        type;                                               // 动力学参数辨识类型
    int                 sample_frequency{ARAL_TRAJECTORY_SAMPLE_FREQUENCY}; // 测量轨迹的采样频率
};//工具标定配置信息

其中type = TOOL_GRAVITY_JNT_CURRENT_ONLINE = 100, //基于关节电流的工具重力参数在线辨识 sample_frequency为采样频率(默认值为200)

2. 运行轨迹

在线辨识即指机器人正常运动的用户点位

3.采集数据

3.1 采集数据

基于关节电流的工具重力参数在线辨识:带载运行激励轨迹,记录以下数据:关节角q,速度qd,加速度qdd,关节电流current,温度temp,末端力传感器F_end,底座力传感器F_base

 *数据格式如下:
 *q1 ... q6, qd1...qd6,...,F_base1 ... F_base6 带载数据,共n行

软件部完成此步骤

3.2 加载采集的数据

软件部完成此步骤

4.负载辨识

4.1 调用如下接口,实现在线辨识负载功能

    /**
     * @brief 负载动力学参数在线辨识(工具辨识)
     * @param trajFeature: 辨识需设置的参考轨迹特征信息(包括辨识类型, 运动属性和激励轨迹特征系数)
     *                     trajFeature.config.: 为激励轨迹的配置参数,包含辨识类型及运动属性
     *                       trajFeature.config.type = TOOL_GRAVITY_JNT_CURRENT_ONLINE;
     *                     trajFeature.config.sample_frequency = 200(实际采样频率,一般默认为200);
     *                     trajFeature.coeff: 为激励轨迹的特征系数,目前仅傅利叶级数激励激励轨迹具有该系数
     * @param is_first: 是否第一次调用该函数
     * @param tool_para: 初始负载参数(额定负载参数/上一次辨识获得的负载参数)
     * @param data_raw: 用户传入的测量参数(参数传入顺序与http://git.aubo-robotics.cn:8001/aral/aral_export/-/issues/541里面规定的一致)
     * @param results: 每个时刻输出的估计参数, 具体的数值意义根据不同的type有不同的定义
     *        if type = TOOL_GRAVITY_JNT_CURRENT_ONLINE;
     *        results[i].linkpara = [m,cx,cy,cz,ixx,iyy,izz,ixy,ixz,iyz]; 第i个时刻下辨识得到的负载参数[质量,在法兰坐标系下的质心,在法兰坐标系下的惯性张量]
     *        results[i].error = [average,max,rms]double {0.0};              // 第i个时刻下关节力矩误差
     * @return: 返回值 < 0 表示计算失败
     */
    ARAL_API_COMMON(1.0)  int calibDynamicParaOnline(const CalibTrajectoryFeature& trajFeature, bool is_first, const RLInertia& tool_para, const DoubleVecVec& data_raw, std::vector<ToolCalibResult>& results) = 0;
  • is_first为true时,即第一次调用该函数,负载初始值如果已知,正常设置,如果未知,建议质量设置为额定负载,其余参数设置为0
  • 传入数据data_raw时,为了提高辨识结果准确度,数据量应不少于400

5.调用示例

TEST_FIXTURE(AuboRobotInterface, testToolDynamicIdentifyOnline)
{
    //! step1: 设置相关参数
    //! step1.1: 设置机器人类型
    Setup("aubo_i5");
    //! step1.1: 设置力矩系数
    robot->mdlSetJointTorqueConstant(motor_const);
    //! step1.3: 设置摩擦参数
    robot->mdlSetJointFrictionParameter(friction_para);
    //! step1.4: 设置重力加速度
    robot->mdlSetGravityVectorInBase(gravity_acc);
    //! step1.5: 设置动力学参数
    robot->mdlSetRobotLinkDynamicParameter(link_para);
    //! step1.6: 设置激励轨迹和辨识配置参数
    interface::CalibConfig excite_traj_config;
    excite_traj_config.type         = 100;
    excite_traj_config.sample_frequency = 200;//采样频率
    std::vector<double> traj_parameter;
    trajFeature.coeff = traj_parameter;
    trajFeature.config = excite_traj_config;

    //! step2: 负载辨识
    std::vector<interface::ToolCalibResult> paraEst0, paraEst1, paraEst2;
    MatrixNd tool_para_0(10, 1);  // 创建一个 10x1 的矩阵
    tool_para_0 << 10, 0, 0, 0, 0, 0, 0, 0, 0, 0;  // 负载辨识初始值,质量可以用额定负载,其余参数为0 
    unsigned int total_rows = data_raw.size();
    unsigned int group_size = total_rows / 3; // 每组的行数
    // 计算余数
    unsigned int remainder = total_rows % 3;

    // 将数据均分为三组
    for (unsigned int i = 0; i < group_size; ++i)
    {
        data_raw_0.push_back(data_raw[i]);
        data_raw_1.push_back(data_raw[i + group_size]);
        data_raw_2.push_back(data_raw[i + 2 * group_size]);
    }

    // 处理余下的行
    for (unsigned int i = 0; i < remainder; ++i)
    {
        data_raw_2.push_back(data_raw[total_rows - remainder + i]);
    }
    //第一次调用,tool_para_0用额定负载
    ret = robot->calibDynamicParaOnline(trajFeature, true, tool_para_0, data_raw_0, paraEst0);
    tool_para_1 = paraEst0.back().inertia;
    //第二次调用,tool_para_1用上一次辨识计算得到的值
    ret = robot->calibDynamicParaOnline(trajFeature, false, tool_para_1, data_raw_1, paraEst1);
    tool_para_2 = paraEst1.back().inertia;
    //第三次调用,tool_para_2用上一次辨识计算得到的值
    ret = robot->calibDynamicParaOnline(trajFeature, false, tool_para_2, data_raw_2, paraEst2);
}

results matching ""

    No results matching ""